/*
 * Funciones.c
 *
 *  Created on: 09/11/2011
 *      Author: utn_so
 */

#include "../../headers/GlobalHeader.h"

extern int32_t cabezalesPorCilindro;
extern int32_t sectoresPorPista;

PPD_CHS ppd_LBAToCHS(int32_t sectorRecibido){

	PPD_CHS estructuraCHS;
	int32_t temp=0;

	estructuraCHS.cylinder=(sectorRecibido/(sectoresPorPista*cabezalesPorCilindro));

	temp= (sectorRecibido) % ((cabezalesPorCilindro*sectoresPorPista));

	estructuraCHS.head=(sectorRecibido / sectoresPorPista ) % cabezalesPorCilindro;

	estructuraCHS.sector=sectorRecibido % sectoresPorPista +1;

	return estructuraCHS;
}

int32_t ppd_CHStoLBA(PPD_CHS structRecibido){

	int32_t formula;

	formula=((structRecibido.cylinder*cabezalesPorCilindro)+structRecibido.head)*sectoresPorPista+structRecibido.sector-1;

	return formula;
}
void imprimeSectoresRecorridos(int32_t *ptrSectoresRecorridos, int32_t size_total)
{
    int32_t cantidadSectores, i;

    cantidadSectores = size_total / sizeof(int32_t);

    printf("Sectores Recorridos: ");

    for (i = 0; i < cantidadSectores; i++)
    {
    	PPD_CHS estructura = ppd_LBAToCHS(ptrSectoresRecorridos[i]);
   	 	printf("%d:%d ", estructura.cylinder,estructura.sector);
    }

    printf("\n");
}

int validoMedianteRegex(char* textoParaValidar, char * pattern){
	regex_t    preg;
	int        rc;
	size_t     nmatch = 2;
	regmatch_t pmatch[2];

	if (0 != (rc = regcomp(&preg, pattern, REG_EXTENDED))) {
		printf("regcomp() failed, returning nonzero (%d)\n", rc);
        exit(EXIT_FAILURE);
    }

	rc = regexec(&preg, textoParaValidar, nmatch, pmatch, 0);
    regfree(&preg);
    return rc;
}

void imprimirProximoSector(int32_t proximoSector)
{
	PPD_CHS sector;

	switch(proximoSector)
	{
	case -1 :
		printf("Proximo sector: ...");
		break;

	default :
		sector = ppd_LBAToCHS(proximoSector);
		printf("Proximo sector: %d:%d\n", sector.cylinder, sector.sector);
		break;
	}
}

int32_t diferenciaEntreSectores(PPD_CHS sector1,PPD_CHS sector2)
{
	int32_t resultado;

	resultado = abs(sector1.cylinder-sector2.cylinder);

	if(sector1.sector <= sector2.sector)
	{
		resultado = resultado + abs(sector2.sector-sector1.sector);
	}
	else
	{
		resultado = resultado + ((sectoresPorPista)-sector1.sector) + sector2.sector;
	}

	return resultado;
}

